import plugin from '../../lib/plugins/plugin.js'
import request from 'request'
import fs from 'node:fs'
import { segment } from 'oicq'

//图床的api，可以换自己的，随意，图床地址https://www.picgo.net（免费）
//图传生成的链接5分钟后失效，介意的最好自己弄个key
var imageup = 'chv_W62p_56237fd84ea0d8f73b07efcfc5bea8b24e7e35ba4b03d4257460d3fbedb8683e75a15990b61a24e9f1294b54e2a01a71f5cf32dc9986ec4e1c8b396c17aa55be'; //图床api密钥
var bigjpg = ''; //放大接口api密钥，前往https://bigjpg.com/zh获取（付费）

export class example extends plugin {
  constructor() {
    super({
      /** 功能名称 */
      name: '图片放大',
      /** 功能描述 */
      dsc: '简单开发示例',
      /** https://oicqjs.github.io/oicq/#events */
      event: 'message',
      /** 优先级，数字越小等级越高 */
      priority: 4500,
      rule: [
        {
          /** 命令正则匹配 */
          reg: '^#(图片|照片)放大',
          /** 执行方法 */
          fnc: 'fangda'
        },
        {
          /** 命令正则匹配 */
          reg: '^#放大查询',
          /** 执行方法 */
          fnc: 'chaxun'
        },
        {
          /** 命令正则匹配 */
          reg: '^#放大重试',
          /** 执行方法 */
          fnc: 'chongshi'
        },
      ]
    })
  }

  /**
   * https://bigjpg.com/
   * 流程：
   * 下载图片到本地
   * 将图片上传至图床，并获取链接
   * 带上链接请求bigjpg放大图片
   * 每隔10秒查询进度，直到出结果为止
   * 
   * @param e oicq传递的事件参数e
   */
  async fangda(e) {
    if(!bigjpg){
      e.reply('请先填写放大接口的key\n前往https://bigjpg.com/zh获取（付费）')
      return true;
    }
    if(e.msg.replace(/#图片放大/,'') == '帮助'){
      e.reply('#图片放大(放大参数1~4) (降噪参数0~4)\n放大参数对应x2，x4，x8，x16\n降噪参数分别对应：无，低，中，高，最高\n例如：#图片放大1 4')
      return true;
    } 
    let z = e.msg.match(/\d/g); //前放大倍数1-4，后降噪-1-3
    let st = 'art';
    if(e.msg.match(/#(图片|照片)放大.*/g)[1] == '照片'){
      st = 'photo';
    }
    console.log(`获取到的参数：${z}`)
    if(!z){
      var x = 1;
      var y = 3;
    } else {
      console.log(z);
      if(z[0] && 0 < +z[0] < 5){
        var x = z[0];
      } else if(!0 < +z[0] < 5){
        e.reply('放大倍数为1~4')
        return true;
      }
      if(-1 < +z[1] < 5){
        var y = +z[1]-1;
      } else {
        e.reply('减噪值为0~4的整数')
        return true;
      }
    }
    //下载图片
    if (!e.img) {
      e.reply('请和图片一起发送')
      return true;
    }
    let ffd;
    let jz;

    switch (x) {
      case '1':
        ffd='×2'
        break;
      case '2':
        ffd='×4'
        break;
      case '3':
        ffd='×8'
        break;
      case '4':
        ffd='×16'
        break;
    }
    switch (y) {
      case -1:
        jz='无'
        break;
      case 0:
        jz='低'
        break;
      case 1:
        jz='中'
        break;
      case 2:
        jz='高'
        break;
      case 3:
        jz='最高'
        break;
    }
    // console.log(`放大：${fd}\n降噪：${y}`);
    let file = `${process.cwd()}/data/fangda.jpg`;
    request.get(e.img[0])
      .on('error', (err) => {
        console.log(err);
      })
      .on('response', (response) => {
        console.log(response.statusCode);
      })
      .pipe(fs.createWriteStream(file))
      .on('finish', () => {
        console.log('下载完成');

        //上传到图床
        let formData = {
          key: imageup,
          source: fs.createReadStream(file)
        };
        request.post({ url: 'https://www.picgo.net/api/1/upload', formData: formData }, function optionalCallback(err, formData,body) {
          if (err) {
            return console.error('upload failed:', err);
          }
          let obj = JSON.parse(body);
          if (obj.status_code !== 200) {
            e.reply('上传图片失败，五分钟后重试这张图')
            return true;
          }
          //上传完成，请求放大接口
          //放大参数
          let data = {
            style: st,
            noise: y,
            x2: x,
            input: obj.image.image.url
          }

          let options = {
            url: 'https://bigjpg.com/api/task/',
            headers: {
              'X-API-KEY': bigjpg
            },
            form: {
              conf: JSON.stringify(data)
            }
          };

          request.post(options, (err, res, body) => {
            if (err) {
              console.log(err);
            } else {
              let fd = JSON.parse(body);
              console.log(fd);
              e.reply([
                `放大:${ffd}；降噪:${jz}`,
                `\n本月剩余次数：${fd.remaining_api_calls}`,
                `\n本次任务id：${fd.tid}`,
                `\n预计时长：${fd.minute}分钟内`
              ])

              //反复查询进度
              let id = setInterval(() => {
                request(`https://bigjpg.com/api/task/${fd.tid}`, (err, res, body) => {
                  if (!err) {
                    let obj = JSON.parse(body);
                    if (body !== '{}') {
                      if (obj[fd.tid].status == 'success') {
                        console.log(body);
                        e.reply(segment.image(obj[fd.tid].url),true);
                        clearInterval(id)
                      } else {
                        if (obj[fd.tid].status == 'error') {
                          e.reply('放大请求错误，请重新发送',true);
                          clearInterval(id)
                        }
                      }
                    }
                  }
                });
              }, 10000);
            }
          });
        });
      });
  }

  async chaxun(e) {
    let emsg = e.msg.replace(/#放大查询/g, '');
    request(`https://bigjpg.com/api/task/${emsg}`, (err, res, body) => {
      if (!err) {
        let obj = JSON.parse(body);
        if (body !== '{}' && obj[emsg].status == 'success') {
          console.log(body);
          e.reply(segment.image(obj[emsg].url));
        } else {
          if (obj[emsg].status == 'error') {
            e.reply('放大请求错误，请重新发送');
          } else {
            e.reply('该任务进行中...', true);
          }
        }
      }
    });
  }
  async chongshi(e) {
    let emsg = e.msg.replace(/#放大重试/g, '');
    request.post(`https://bigjpg.com/api/task/${emsg}`, (err, res, body) => {
      if (!err) {
        let obj = JSON.parse(body);
        console.log(obj);
        e.reply('重试提交成功')
      }
    });
  }
}
